 /* Created on 28/03/2005  */
package br.ufmg.dees.insane.ui.rich.learn.util.solucao;

import br.ufmg.dees.insane.ui.rich.learn.util.funcao.Funcao;
import br.ufmg.dees.insane.ui.rich.learn.util.util.NotacaoCientifica;

/** Classe que obtem a raiz de uma funcao em um intervalo dado
 * pelo metodo da Bisecao
 * 
 * @author Camara, Luciana
 * @since 26/03/05 
 * @version 1.0 */

public class BiSecao {
  
  /** Metodo que obtem a raiz de uma funcao em um intervalo
   * @param f Funcao da qual se quer obter a raiz      
   * @param xe Valor de x a esquerda do intervalo 
   * @param xd Valor de x a direita  do intervalo
   * @param conv Instancia da classe convergencia para controle
   * @return o valor da raiz no intervalo (se existir)     */
  public static double getRaiz
  (Funcao f,double xe, double xd,Convergencia conv) {
    double erro=Math.abs(xd-xe)/2;
    double xm=xe+erro;
    double y=f.calculaValor(xm);
    conv.setErro(erro);
    conv.setFy(y);
    conv.setPasso(conv.getPasso()+1);
    conv.addLogtxt("Passo= "+conv.getPasso()+"   xm= "+NotacaoCientifica.norma(xm,5));
    conv.addLogtxt("   f(xm)= "+NotacaoCientifica.norma(y,3)+"   erro= ");
    conv.addLogtxt(NotacaoCientifica.norma(Math.abs(erro),3)+"\n");
    while(!conv.AnaliseConvergencia()){
      if (f.calculaValor(xe)*f.calculaValor(xm)<0){
        xm=getRaiz(f,xe,xm,conv);
      }
      else xm=getRaiz(f,xm,xd,conv);
    }
    return xm;
  }// fim de getRaiz()
  
}// fim de BiSecao
